Currying হল একটি ফাংশনাল প্রোগ্রামিং কৌশল যেখানে একটি বহু-আরগুমেন্ট ফাংশনকে একটি সিরিজের একক-আরগুমেন্ট ফাংশনে পরিণত করা হয়। এর মানে হল যে, প্রথমে একটি আর্গুমেন্ট দিয়ে ফাংশনটি কল করা হয়, এবং এটি একটি নতুন ফাংশন প্রদান করে যা পরবর্তী আর্গুমেন্ট গ্রহণ করবে, এবং এভাবে পুরো আর্গুমেন্ট গুলি প্রয়োগ করতে থাকে।
Currying প্রোগ্রামিংয়ের মধ্যে ব্যাপকভাবে ব্যবহৃত হয় যেখানে আপনি একটির পর একটি ফাংশন কল করতে পারেন, এবং প্রতিটি কল আগের ফলাফল নিয়ে কাজ করে। Java তে Currying করতে আপনি Lambda Expressions ব্যবহার করতে পারেন।
Currying এর ধারণা:
ধরা যাক, একটি সাধারণ ফাংশন:
public int add(int a, int b) {
return a + b;
}
এই ফাংশনটিকে Currying ব্যবহার করে পুনর্গঠন করতে হবে যাতে এটি একটি একক আর্গুমেন্ট নিয়ে প্রথমে একটি ফাংশন ফেরত দেয়, এবং পরবর্তী আর্গুমেন্টকে গ্রহণ করবে একটি নতুন ফাংশনের মাধ্যমে।
Currying এর মূল লক্ষ্য হলো একটি একক আর্গুমেন্ট ফাংশন তৈরি করা, যা তার আর্গুমেন্ট গ্রহণ করতে হবে ধাপে ধাপে।
Java তে Currying Function তৈরি করা:
Step 1: Currying Function এর সাধারণ উদাহরণ
একটি সাধারণ add ফাংশনকে currying আকারে পরিণত করা।
public class CurryingExample {
// Currying function: first function takes the first argument and returns a function that takes the second argument
public static Function<Integer, Function<Integer, Integer>> add() {
return a -> b -> a + b;
}
public static void main(String[] args) {
// Call the curried function
Function<Integer, Function<Integer, Integer>> curriedAdd = add();
// Apply the first argument
Function<Integer, Integer> addFive = curriedAdd.apply(5);
// Apply the second argument and get the result
System.out.println(addFive.apply(3)); // Output: 8
}
}
ব্যাখ্যা:
- add(): প্রথমে একটি ফাংশন রিটার্ন করে, যা প্রথম আর্গুমেন্ট
aনেয় এবং একটি নতুন ফাংশন ফেরত দেয় যা দ্বিতীয় আর্গুমেন্টbনেবে এবংa + bপ্রদান করবে। - curriedAdd.apply(5): প্রথম আর্গুমেন্ট ৫ প্রেরণ করা হয়, যা একটি নতুন ফাংশন প্রদান করে।
- addFive.apply(3): পরবর্তী আর্গুমেন্ট ৩ প্রেরণ করা হয় এবং আমরা শেষ আউটপুট (
a + b) প্রাপ্তি করি।
এভাবে, Currying ফাংশন ব্যবহৃত হয়েছে যেখানে প্রথমে একটি আর্গুমেন্ট গ্রহণ করে এবং তারপর পরবর্তী আর্গুমেন্ট নেওয়া হয়। এটি একটি higher-order function তৈরি করেছে যা একের পর এক ফাংশন অ্যাপ্লাই করতে সক্ষম।
Step 2: Currying ব্যবহার করে আরও উদাহরণ
Currying এর সাথে আরও জটিল ফাংশন তৈরি করতে পারেন। ধরুন, আমাদের একটি ফাংশন আছে যা তিনটি আর্গুমেন্ট গ্রহণ করে:
public class CurryingExample {
// A curried function that accepts three arguments
public static Function<Integer, Function<Integer, Function<Integer, Integer>>> multiply() {
return x -> y -> z -> x * y * z;
}
public static void main(String[] args) {
// Apply the curried function
Function<Integer, Function<Integer, Function<Integer, Integer>>> curriedMultiply = multiply();
// Apply the first argument
Function<Integer, Function<Integer, Integer>> multiplyByTwo = curriedMultiply.apply(2);
// Apply the second argument
Function<Integer, Integer> multiplyByThree = multiplyByTwo.apply(3);
// Apply the third argument and get the result
System.out.println(multiplyByThree.apply(4)); // Output: 24
}
}
ব্যাখ্যা:
- multiply(): এটি একটি currying function যা তিনটি আর্গুমেন্ট গ্রহণ করার জন্য সাজানো। প্রথমে একটি আর্গুমেন্ট
xগ্রহণ করে, তারপর পরবর্তী আর্গুমেন্টyএবং শেষ আর্গুমেন্টzগ্রহণ করে এবং শেষমেশ তাদের গুণফল প্রদান করে। - curriedMultiply.apply(2): প্রথম আর্গুমেন্ট
2প্রদান করা হয়, যা একটি নতুন ফাংশন প্রদান করে। - multiplyByTwo.apply(3): পরবর্তী আর্গুমেন্ট
3প্রদান করা হয়, যা আবার একটি নতুন ফাংশন প্রদান করে। - multiplyByThree.apply(4): অবশেষে, পরবর্তী আর্গুমেন্ট
4প্রদান করা হয় এবং আমরা তিনটি আর্গুমেন্টের গুণফল (২ × ৩ × ৪ = ২৪) পেয়ে থাকি।
Step 3: Currying ব্যবহার করে আরও কাস্টম উদাহরণ
ধরা যাক, আপনি একটি ব্যক্তিগত প্রকল্পে Currying ব্যবহার করতে চান যেখানে দুটি ভিন্ন কৌশল প্রয়োগ করতে হয় (যেমন নামের মান এবং বয়সের মান গ্রহণ করে একটি পূর্ণাঙ্গ বার্তা তৈরি করা):
public class CurryingExample {
// Currying function that creates a greeting message
public static Function<String, Function<Integer, String>> greet() {
return name -> age -> "Hello, " + name + "! You are " + age + " years old.";
}
public static void main(String[] args) {
// Applying the curried greet function
Function<String, Function<Integer, String>> greetingFunction = greet();
// Apply first argument (name)
Function<Integer, String> greetJohn = greetingFunction.apply("John");
// Apply second argument (age)
System.out.println(greetJohn.apply(25)); // Output: Hello, John! You are 25 years old.
}
}
এখানে, Currying ব্যবহৃত হচ্ছে যাতে প্রথমে নাম ইনপুট নেওয়া হয় এবং পরে বয়স ইনপুট নিয়ে পূর্ণাঙ্গ বার্তা তৈরি করা হয়।
Currying এর সুবিধা:
- Code Reusability: একটি ফাংশনকে একাধিকভাবে ব্যবহার করা যায়। প্রথম ফাংশনটির আর্গুমেন্ট প্রদান করে, এবং পরবর্তী ফাংশনগুলিতে ধাপে ধাপে আর্গুমেন্টগুলো প্রদান করা হয়।
- Partial Application: আপনি কেবলমাত্র কিছু আর্গুমেন্ট প্রদান করে, বাকি আর্গুমেন্টগুলো প্রয়োগ করতে পারেন, ফলে এটি partial application এর মতো কাজ করে।
- Functional Style: Currying ফাংশনাল প্রোগ্রামিং প্যাটার্নে একটি শক্তিশালী কৌশল এবং এটি কোডকে আরও পরিষ্কার এবং সহজে বুঝতে সহায়তা করে।
- Code Modularization: Currying আপনাকে কোডের ছোট ছোট অংশে বিভক্ত করতে সহায়তা করে, যা পরে একত্রিত করে সম্পূর্ণ সমাধান প্রদান করা যায়।
সারাংশ:
Currying হল ফাংশনাল প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ কৌশল, যেখানে একটি বহু-আর্গুমেন্ট ফাংশনকে একের পর এক আর্গুমেন্ট নেয়ার জন্য ছোট ছোট ফাংশনে পরিণত করা হয়। Java Lambda Expressions ব্যবহার করে Currying ইমপ্লিমেন্ট করা সম্ভব এবং এটি কোডের রিডেবিলিটি এবং পুনঃব্যবহারযোগ্যতা উন্নত করে। Currying এর মাধ্যমে partial application এবং code modularization সহজে করা যায়, যা বড় প্রকল্পে কার্যকরী হতে পারে।
Read more